package com.arrayup;

import java.util.Arrays;

/**
 * @Author WaveHi
 * @Date 12/8/2021 下午 3:11
 * @Version 1.0
 * @Contact HJBWaveHi@163.com
 * @Description 数据的容器
 */
public class MyBuilder<T> {

    private T[] values;//容器
    private int capacity;//容器容量
    private int count;//容器存的数据个数

    public MyBuilder() {

        values = (T[]) new Object[10];

    }

    public MyBuilder(int capacity) {

        this.capacity = capacity;
        values = (T[]) new Object[capacity];

    }

    /**
     * 向容器添加数据
     * @param data 需要添加的数据
     */
    public void add(T data) {

        //判断容量是否还足以添加数据
        if((count + 1) > capacity) {

            capacity = count * 2;
            values = Arrays.copyOf(values,capacity);

        }

        //添加数据
        values[count] = data;
        count++;

    }

    /**
     * 删除容器指定位置上的元素
     * @param index 需删除数组的元素
     */
    public void delete(int index) {

        //判断指定位置上是否有数据
        if(index > count) {

            System.out.println("当前位置没有数据");
            return;

        }

        //将指定位置后的数据前移
        //循环前移
        for(int i = index;i < count + 1;i++) {

            values[index] = values[index + 1];

        }

        values[count] = null;
        count--;

    }

    /**
     * 修改容器的数据
     * @param index 需修改数据的索引位置
     * @param data 修改后的目标数据
     */
    public void setData(int index,T data) {

        //判断指定位置上是否有数据
        if(index > count) {

            System.out.println("该位置没有数据");
            return;

        }

        //修改
        values[index] = data;

    }

    /**
     * 获取指定索引位置上的数据
     * @param index 目标数据的索引位置
     * @return 返回null该位置没有数据
     */
    public T getData(int index) {

        //判断指定位置上是否有数据
        if(index > count) {

            System.out.println("该位置没有数据");
            return null;

        }

        //获取数据
        return values[index];

    }

    /**
     * 向容器插入数据
     * @param index 需插入的位置
     * @param data 需插入的数据
     */
    public void insert(int index,T data) {

        //判断容器是否还有足够容量存储数据
        if((count + 1) > capacity) {

            //扩容
            capacity = count * 2;
            values = Arrays.copyOf(values,capacity);

        }

        //判断指定位置是否有数据
        if(index < 0 || index > count) {

            System.out.println("该位置没有数据");
            return;

        }

        //后移数据
        for(int i = count;i > index;i++) {

            values[count] = values[count - 1];

        }

        //插入
        values[index] = data;
        count++;

    }

    /**
     * 获取容器的元素个数
     * @return 元素个数
     */
    public int length() {

        return count;

    }

    public String toString() {

        //接收打印的结果
        StringBuilder s1 = new StringBuilder();

        return new String(s1);

    }

}
